home *** CD-ROM | disk | FTP | other *** search
/ Network Support Library / RoseWare - Network Support Library.iso / menu / mxmenu.exe / NOVTRANS.MNU < prev    next >
Text File  |  1994-03-07  |  14KB  |  478 lines

  1. Comment
  2. ========================================================================
  3.  
  4. Novell menu to MarxMenu Translator:
  5.  
  6. Copyright 1989-93 by Marc Perkel * All rights reserved.
  7.  
  8. Usage: MARXMENU NOVTRANS <novell menu>
  9.  
  10. This program was written to translate Novell menus to MarxMenus. It is
  11. not an exact translation, but does the bulk of the work. It is up to you
  12. to edit the output file and tune the menu the way you want.
  13.  
  14. I have made no attempt to copy color information. I am not presenting
  15. selections in sorted order, but in the order in which they are defined.
  16.  
  17. If the translation is successful then your old menu will be renamed with
  18. a NOV extension.
  19.  
  20. ========================================================================
  21. EndComment
  22.  
  23. Var
  24.   Menus
  25.   MenuPtr
  26.   LinePtr
  27.   ThisMenu
  28.   ThisChoice
  29.   CommandPtr
  30.   BoxDim
  31.   VarNum
  32.   PromptLine
  33.   Out
  34.   Cap
  35.   InputAVar
  36.   NovellFileName
  37.   MarxMenuFileName
  38.   NovellTempFileName
  39.   NovFileExists
  40.   Greek
  41.   Titles
  42.   QuietMode
  43.   NovLines
  44.  
  45. ;----- Translator Messages
  46.  
  47. Const
  48.    TopMessage = "Joe Blow's Master Menu"
  49.    BottomMessage = "*-<< Acme Manufacturing Company >>-*"
  50.  
  51. ;----- If you want the Greek Column effect, set to true
  52.  
  53. Greek = False
  54.  
  55. Qualifier MenuName MenuTitle YPos XPos MenuColor MenuChoices
  56. Qualifier ChoiceName ChoiceCmd
  57.  
  58. Comment
  59. ========================================================================
  60.  
  61. This is the main body of the NovTrans Program.
  62.  
  63. ========================================================================
  64. EndComment
  65.  
  66. if not NetWorkVersion
  67.    ClearScreen
  68.    Writeln
  69.    Writeln 'This translator requires the network version of MarxMenu to Run!'
  70. endif
  71.  
  72. PreAmble
  73. GetFileNames
  74. Parse
  75. if MenuPtr = 0
  76.    Writeln
  77.    Writeln
  78.    Writeln 'Error: ' NovellTempFileName ' is not a Novell menu!
  79.    ExitMenu
  80. endif
  81. Header
  82. WriteOutMenus
  83. Footer
  84.  
  85. ClearScreenFirst Off
  86. Writeln
  87.  
  88. if QuietMode
  89.    Execute 'MARXCOMP.EXE ' + MarxMenuFileName + ' /U'
  90. else
  91.    Execute 'MARXCOMP.EXE ' + MarxMenuFileName
  92. endif
  93.  
  94. if ReturnCode = 0
  95.    Writeln
  96.    Writeln 'Menu Translation Sucessful!'
  97.    Writeln
  98.    if not NovFileExists and not QuietMode
  99.       Writeln 'Renaming ' NovellTempFileName ' to ' ForceExtension(NovellTempFileName,'NOV')
  100.       FileRename(NovellTempFileName,ForceExtension(NovellTempFileName,'NOV'))
  101.       Writeln 'Renaming ' MarxMenuFileName ' to ' NovellTempFileName
  102.       FileRename(MarxMenuFileName,NovellTempFileName)
  103.       Writeln
  104.       Write 'Your original novell menu has been renamed to: '
  105.       Writeln ForceExtension(NovellTempFileName,'NOV')
  106.       Writeln
  107.    endif
  108.    Writeln 'To test your menu type MARX ' NovellFileName '.
  109. endif
  110.  
  111. ExitMenu
  112.  
  113. Comment
  114. =====================================
  115.  
  116. Subroutine area.
  117.  
  118. =====================================
  119. EndComment
  120.  
  121. ;----- Initilize Variables and Environment
  122.  
  123. Procedure PreAmble
  124.    ClearScreenOnExit Off
  125.    if UpperCase(ParamStr(3)) = 'U'
  126.       Quietmode = True
  127.       OutFile = 'NUL'
  128.    endif
  129.    StandardIO
  130.    Writeln
  131.    NovellFileName = UpperCase(ParamStr(2))
  132.    if Extension(NovellFileName) = 'MNU'
  133.       length(NovellFileName) = length(NovellFileName) - 4
  134.    endif
  135.    Usage
  136. EndProc
  137.  
  138. ;----- Proper Usage Procedure
  139.  
  140. Procedure Usage
  141.    if NovellFileName = ''
  142.       Writeln('Converts Novell menus to MarxMenus.')
  143.       Writeln
  144.       Writeln('  Usage: MarxMenu NovTrans <menu>')
  145.       ExitMenu
  146.    endif
  147. EndProc
  148.  
  149. ;----- Get File Names
  150.  
  151. Procedure GetFileNames
  152.    if pos('.',NovellFileName) = 0
  153.       if QuietMode
  154.          NovellTempFileName = ForceExtension(NovellFileName,'MNU')
  155.       else
  156.          NovellTempFileName = ForceExtension(NovellFileName,'NOV')
  157.          if ExistOnPath(NovellTempFileName) = ''
  158.             NovellTempFileName = ForceExtension(NovellFileName,'MNU')
  159.          else
  160.             NovFileExists = True
  161.          endif
  162.       endif
  163.  
  164.    endif
  165.  
  166.    NovellTempFileName = ExistOnPath(NovellTempFileName)
  167.  
  168.    if NovellTempFileName = ''
  169.       Writeln 'Error: ' NovellFileName ' does not exist!'
  170.       ExitMenu
  171.    endif
  172.  
  173.    if NovFileExists
  174.       MarxMenuFileName = ForceExtension(NovellTempFileName,'MNU')
  175.    else
  176.       MarxMenuFileName = ForceExtension(NovellTempFileName,'TMP')
  177.    endif
  178.  
  179.    ReadTextFile(NovellTempFileName,NovLines)
  180.    Writeln 'Creating ' MarxMenuFileName
  181. EndProc
  182.  
  183.  
  184. ;----- Write out the MarxMenu Source Header
  185.  
  186. Procedure Header
  187.   FileAssign(Out,MarxMenuFileName)
  188.   FileCreate(Out)
  189.   WriteOut
  190.   WriteOut 'Comment'
  191.   WriteOut '=========================================================='
  192.   WriteOut
  193.   WriteOut 'This file was converted from Novell Menu: ',NovellTempFileName
  194.   WriteOut
  195.   WriteOut 'It should behave in a similar way to the original menu but'
  196.   WriteOut 'not necessarilly exactly the same. It will be close enough'
  197.   WriteOut 'for you to fine tune it the way you want.'
  198.   WriteOut
  199.   WriteOut 'To add a choice to a menu simply use the AddChoice command'
  200.   WriteOut 'then add the appropiate Onkey statement.'
  201.   WriteOut 'The menu will make the size adjustments accordinaly.'
  202.   WriteOut
  203.   WriteOut '  Example:'
  204.   WriteOut '      AddChoice("Print Console",10)'
  205.   WriteOut '      ...'
  206.   WriteOut '      ...'
  207.   WriteOut '      OnKey Task(10)'
  208.   WriteOut '        cd \public'
  209.   WriteOut '        PConsole'
  210.   WriteOut '      ...'
  211.   WriteOut
  212.   WriteOut "If you want to change the menu's center, pass the XY"
  213.   WriteOut "coordinates to menu's CenterStretchBox procedure."
  214.   WriteOut
  215.   WriteOut '   Example:'
  216.   WriteOut '      CenterStretchBox("Menu Header",40,12)'
  217.   WriteOut
  218.   WriteOut 'This will cause the menu to center at Col 40, Row 12'
  219.   WriteOut
  220.   WriteOut 'Instead of defining the center of the box, there is a command'
  221.   WriteOut 'CornerStretchBox where the box grows down and right.'
  222.   WriteOut
  223.   WriteOut '   Example:'
  224.   WriteOut '      CornerStretchBox("Menu Header",8,6)'
  225.   WriteOut
  226.   WriteOut 'To control custom features, edit CUSTOM.INC and other INCLUDE Files.'
  227.   WriteOut
  228.   WriteOut '========================================================='
  229.   WriteOut 'EndComment'
  230.   WriteOut
  231.   WriteOut ';----- Create Variables'
  232.   WriteOut
  233.   WriteOut 'var'
  234.   WriteOut '  NovVar'
  235.   WriteOut '  KeepUsersInMenu'
  236.   WriteOut
  237.   WriteOut
  238.   WriteOut ';----- Here is where you add you own menu title and status line message'
  239.   WriteOut
  240.   WriteOut 'MenuTitle      = "',TopMessage,'"'
  241.   WriteOut 'StatusLineText = "',BottomMessage,'"'
  242.   WriteOut
  243.   WriteOut ';----- Load Novell look and feel routines'
  244.   WriteOut
  245.   WriteOut 'Include "CUSTOM.INC"'
  246.   if Greek then WriteOut 'Greek = True'
  247.   WriteOut
  248.   WriteOut 'KeepUsersInMenu Off  ;Change to On to keep users in menu.'
  249.   WriteOut
  250.   WriteOut 'Comment'
  251.   WriteOut '================================='
  252.   WriteOut
  253.   WriteOut 'MarxMenu is capable of software metering. This means that it can'
  254.   WriteOut 'limit the number of users of an application to a fixed amount.'
  255.   WriteOut
  256.   WriteOut '  OnKey Task (2)'
  257.   WriteOut "     |if Limit('LOTUS',6) then Return ;limit Lotus to 6 Users"
  258.   WriteOut '     CD \PUBLIC\LOTUS'
  259.   WriteOut '     123'
  260.   WriteOut
  261.   WriteOut 'Read the METER.INC file for more details.'
  262.   WriteOut
  263.   WriteOut '================================='
  264.   WriteOut 'EndComment'
  265.   WriteOut
  266.   WriteOut "Include 'METER.INC'  ;Software Metering"
  267.   WriteOut
  268.   WriteOut 'Comment'
  269.   WriteOut '================================='
  270.   WriteOut
  271.   WriteOut 'In order to add menu choices conditionally you would append the'
  272.   WriteOut 'choices to the end of the array after all the default choices'
  273.   WriteOut 'are set. For Example:'
  274.   WriteOut
  275.   WriteOut '   if InGroup("ACCOUNTING","MANAGERS")'
  276.   WriteOut '      AddChoice("Payroll Menu",10)'
  277.   WriteOut '   endif'
  278.   WriteOut
  279.   WriteOut 'Here is where menus are created.'
  280.   WriteOut
  281.   WriteOut '================================='
  282.   WriteOut 'EndComment'
  283.   WriteOut
  284.   FileFlush(Out);
  285. EndProc
  286.  
  287.  
  288. ;----- Write out the MarxMenu Source Footer
  289.  
  290. Procedure Footer
  291.    WriteOut
  292.    WriteOut ';----- End of Menu Translation'
  293.    FileClose(Out)
  294. EndProc
  295.  
  296. ;----- Preprocess Lines
  297.  
  298. Procedure Parse
  299. Var ChoicePtr TotalLines X St St2
  300.    TotalLines = NumberOfElements(NovLines)
  301.    Writeln('Parsing Novell Menu source code ...')
  302.    MenuPtr = 0
  303.    loop NovLines
  304.       if (LoopIndex Mod 10 = 0) or (LoopIndex = TotalLines)
  305.          Write Cr
  306.          Write('Processing Line # ',LoopIndex,' of ',TotalLines)
  307.       endif
  308.       if left(LoopVal,1) = '%'
  309.          ChoicePtr = 0
  310.          CommandPtr = 0
  311.          MenuPtr = MenuPtr + 1
  312.          Actual ThisMenu = Loc Menus[MenuPtr]
  313.          St = mid(LoopVal,2,255)
  314.          Trim(St)
  315.          X = pos(',',St)
  316.          if X = 0 then X = succ(Length(St))
  317.          ThisMenu.MenuTitle = left(St,X - 1)
  318.          Trim(ThisMenu.MenuTitle)
  319.          AppendArray(Titles,UpperCase(ThisMenu.MenuTitle))
  320.          delete(St,1,X)
  321.          St2 = '       '
  322.          if MenuPtr < 10 then St2 = St2 + ' '
  323.          ThisMenu.MenuName = 'Menu' + Str(MenuPtr) + St2 + '{' + ThisMenu.MenuTitle + '}'
  324.          ThisMenu.YPos = value(NextWord(St))
  325.          ThisMenu.XPos = value(NextWord(St))
  326.          ThisMenu.MenuColor = value(NextWord(St))
  327.       else
  328.          if left(LoopVal,1) > ' '
  329.             CommandPtr = 0
  330.             ChoicePtr = ChoicePtr + 1
  331.             Trim(LoopVal)
  332.             if Mid(LoopVal,2,1) = '.'
  333.                Delete(LoopVal,1,2)
  334.                Trim(LoopVal)
  335.             endif
  336.  
  337.             ;----- Get rid of multiple spaces
  338.  
  339.             while pos('  ',LoopVal) > 0
  340.                delete(LoopVal,pos('  ',LoopVal),1)
  341.             endwhile
  342.  
  343.             ;----- Get rid of double quotes
  344.  
  345.             while pos('"',LoopVal) > 0
  346.                delete(LoopVal,pos('"',LoopVal),1)
  347.             endwhile
  348.  
  349.             ThisMenu.MenuChoices[ChoicePtr].ChoiceName = LoopVal
  350.          else
  351.             if LoopVal > ''
  352.                if ChoicePtr = 0
  353.                   Writeln
  354.                   Writeln 'Error in menu line: ' LoopIndex
  355.                   ExitMenu
  356.                endif
  357.                CommandPtr = CommandPtr + 1
  358.                ThisMenu.MenuChoices[ChoicePtr].ChoiceCmd[CommandPtr] = LoopVal
  359.             endif
  360.          endif
  361.       endif
  362.    endloop
  363. EndProc
  364.  
  365. ;----- Create the Menu Choices Array
  366.  
  367. Procedure WriteOutMenuChoices
  368.    Writeln
  369.    Write('Translating: ' + ThisMenu.MenuName + ' ... ')
  370.    WriteOut
  371.    WriteOut ';=============[ ' + ThisMenu.MenuTitle + ' ]============*'
  372.    WriteOut
  373.    if MenuPtr > 1
  374.       WriteOut ':',Left(ThisMenu.MenuName,pred(pos(' ',ThisMenu.MenuName)))
  375.       WriteOut
  376.    endif
  377.    loop ThisMenu.MenuChoices
  378.       WriteOut '  AddChoice("' + LoopVal.ChoiceName + '",' + Str(LoopIndex) + ')'
  379.    endloop
  380.    WriteOut
  381.    WriteOut 'CenterStretchBox("' + ThisMenu.MenuTitle + '",' + Str(ThisMenu.XPos) + ',' + Str(ThisMenu.YPos) + ')'
  382.    WriteOut
  383. EndProc
  384.  
  385. ;----- Create the Onkey Statements
  386.  
  387. Procedure WriteOutOnkeyChoices
  388. var St X Y Z
  389.    loop ThisMenu.MenuChoices
  390.       Actual ThisChoice = Loc LoopVal
  391.       WriteOut 'OnKey Task(' + Str(LoopIndex) + ')'
  392.       loop ThisChoice.ChoiceCmd
  393.          Trim(LoopVal)
  394.          if UpperCase(LoopVal) = '!LOGOUT' then LoopVal = '|Logoff'
  395.          if Left(LoopVal,1) = '%'
  396.             delete(LoopVal,1,1)
  397.             Trim(LoopVal)
  398.             X = PosInList(UpperCase(LoopVal),Titles)
  399.             if X = 0
  400.                Writeln
  401.                Writeln 'Error: Menu ' LoopVal ' not Found!'
  402.                ExitMenu
  403.             endif
  404.             LoopVal = '^' + Menus[X].MenuName
  405.          endif
  406.          if (pos('@',LoopVal) > 0) and (Pos('@ECHO',UpperCase(LoopVal)) = 0)
  407.             X = 1
  408.             while X <= length(LoopVal)
  409.                while (X <= length(LoopVal)) and (mid(LoopVal,X,1) <> '@')
  410.                   X = X + 1
  411.                endwhile
  412.                Z[1] = mid(LoopVal,X,1)
  413.                Z[2] = mid(LoopVal,X + 1,1)
  414.                if (Z[1] = '@') and (((Z[2] > '0') and (Z[3] <= '9')) or (Z[2] = '"'))
  415.                   if Z[2] = '"'
  416.                      insert(' ',LoopVal,X + 1)
  417.                      VarNum = 10
  418.                   else
  419.                      VarNum = ord(Z[2]) - 48
  420.                   endif
  421.                   InputAVar = mid(LoopVal,X + 2,1) = '"'
  422.                   if InputAVar
  423.                      Y = X + 3
  424.                      while (mid(LoopVal,Y,1) <> '"') and (Y <= length(LoopVal))
  425.                         Y = Y + 1
  426.                      endwhile
  427.                      PromptLine = mid(LoopVal,X + 3,Y - (X + 3))
  428.                   else
  429.                      Y = X + 1
  430.                   endif
  431.                   delete(LoopVal,X,Y - X + 1)
  432.                   insert('" NovVar[' + Str(VarNum) + '] "',LoopVal,X)
  433.                   if InputAVar
  434.                      WriteOut '   |NovVar[' Str(VarNum) '] = ReadTextLine("' + PromptLine + '","",0,21)'
  435.                      WriteOut '   |if LastKey = Esc'
  436.                      WriteOut '   |LastKey = " "'
  437.                      WriteOut '   |   Return                 ;Abort if ESC Pressed'
  438.                      WriteOut '   |endif'
  439.                   endif
  440.                endif
  441.             endwhile
  442.             LoopVal = '|Bat "' + LoopVal + '"'
  443.             if right(LoopVal,2) = '""'
  444.                length(LoopVal) = length(LoopVal) - 2
  445.             endif
  446.             Trim(LoopVal)
  447.          endif
  448.          WriteOut '   ' + LoopVal
  449.       endloop
  450.       WriteOut
  451.    endloop
  452. EndProc
  453.  
  454. ;----- Create the Menus
  455.  
  456. Procedure WriteOutMenus
  457.   Writeln
  458.   Loop Menus
  459.      MenuPtr = LoopIndex
  460.      Actual ThisMenu = Loc LoopVal
  461.      WriteOutMenuChoices
  462.      WriteOutOnkeyChoices
  463.      if MenuPtr = 1
  464.         WriteOut 'OnKey ESC'
  465.         WriteOut '   |if not KeepUsersInMenu or NovConsoleOperator'
  466.         WriteOut '   |   LeaveMenu'
  467.         WriteOut '   |endif'
  468.         WriteOut
  469.      endif
  470.   EndLoop
  471. EndProc
  472.  
  473.  
  474. Procedure WriteOut ($OutSt)
  475.    FileWriteln(Out,OutSt)
  476. EndProc
  477.  
  478.